﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CapaPresentacion.Commands;
using CapaPresentacion.Vistas;
using Entidades;
using CapaLogica;
using System.Windows.Input;
using System.Windows;
using System.Windows.Data;
using System.Transactions;
using System.Collections.ObjectModel;
using System.Globalization;

namespace CapaPresentacion.Controles
{
    class NuevoFamiliarAlumnoViewModel 
    {


         public event ReiniciarCU ReiniciarCU;

        #region Variables
        
        private Familiar familiarAlumno;
        private Familiar familiarAlumnoSinModificaciones;
        private RelayCommand saveCommand;
        private RelayCommand newCommand;
        private RelayCommand openCommand;
             

        #endregion

        #region Propiedades


        public ICommand SaveCommand
        {
            get
            {
                return saveCommand;
            }
        }

        public ICommand NewCommand
        {
            get
            {
                return newCommand;
            }
        }

        public ICommand OpenCommand
        {
            get
            {
                return openCommand;
            }
        }

       

        public Familiar FamiliarAlumno
        {
            get { return familiarAlumno; }
            set { familiarAlumno = value; }
        }

        #endregion


        public NuevoFamiliarAlumnoViewModel()
        {
            this.familiarAlumno = new Familiar();
            this.familiarAlumno.LegajoFamiliar = Guid.NewGuid();
            this.familiarAlumno.Eliminado = false;
            this.saveCommand = new RelayCommand(GuardarFamiliarAlumno);
            this.newCommand = new RelayCommand(NuevoFamiliar);
            this.openCommand = new RelayCommand(AbrirFamiliarAlumno);
          
            

      }

        public NuevoFamiliarAlumnoViewModel(Familiar entidad)
        {
            this.familiarAlumno = entidad;
            this.familiarAlumnoSinModificaciones = (Familiar)entidad.Clone();
            this.saveCommand = new RelayCommand(GuardarFamiliarAlumno);
            this.newCommand = new RelayCommand(NuevoFamiliar);
            this.openCommand = new RelayCommand(AbrirFamiliarAlumno);
           
      
        }

        private void NuevoFamiliar(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea cargar los datos de un nuevo familiar?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.NuevoFamiliarAlumno);
            }
        }

        private void AbrirFamiliarAlumno(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea editar los datos de un familiar existente?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.BuscarFamiliarAlumno);
            }
        }

        private void GuardarFamiliarAlumno(Object parameter)
        {

            if (MessageBox.Show("¿Está seguro que desea guardar los datos?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {

                if (Validaciones())
                {
                    
                    try
                    {
                        this.PrimeraLetraNombresMayuscula();

                        if (!new FamiliarAlumnoLogica().ExisteEntidad(this.familiarAlumno.LegajoFamiliar)) // Nuevo Familiar
                        {

                            new FamiliarAlumnoLogica().Agregar(familiarAlumno);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El familiar ha sido creado correctamente");
                            nueva.ShowDialog();

                            this.ReiniciarCU(CasosDeUso.NuevoFamiliarAlumno);
                        }
                        else                        // Edición Familiar
                        {

                            new FamiliarAlumnoLogica().Modificar(familiarAlumno);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El familiar ha sido modificado correctamente");
                            nueva.ShowDialog();
                            this.ReiniciarCU(CasosDeUso.NuevoFamiliarAlumno);
                        }


                    }
                    catch (Exception)
                    {

                        VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "  Ha ocurrido un error y el alumno no se ha guardado");
                        nueva.ShowDialog();

                    }
                        

                }

            }

           
        }

        internal void PrimeraLetraNombresMayuscula()
        {

            this.familiarAlumno.ApellidoFamiliar = CultureInfo.InvariantCulture.TextInfo.ToTitleCase(this.familiarAlumno.ApellidoFamiliar);
            this.familiarAlumno.NombreFamiliar = CultureInfo.InvariantCulture.TextInfo.ToTitleCase(this.familiarAlumno.NombreFamiliar);

            if (this.familiarAlumno.LugarNacimiento != null)
                this.familiarAlumno.LugarNacimiento = CultureInfo.InvariantCulture.TextInfo.ToTitleCase(this.familiarAlumno.LugarNacimiento);

            if (this.familiarAlumno.LocalidadFamiliar != null)
                this.familiarAlumno.LocalidadFamiliar = CultureInfo.InvariantCulture.TextInfo.ToTitleCase(this.familiarAlumno.LocalidadFamiliar);

        }



        internal void CompletarNombresDNI()
        {

            if (String.IsNullOrWhiteSpace(this.familiarAlumno.DniFamiliar))
            {
                this.familiarAlumno.DniFamiliar = this.familiarAlumnoSinModificaciones.DniFamiliar;
            }

            if (String.IsNullOrWhiteSpace(this.familiarAlumno.ApellidoFamiliar))
            {
                this.familiarAlumno.ApellidoFamiliar = this.familiarAlumnoSinModificaciones.ApellidoFamiliar;
            }

            if (String.IsNullOrWhiteSpace(this.familiarAlumno.NombreFamiliar))
            {
                this.familiarAlumno.NombreFamiliar = this.familiarAlumnoSinModificaciones.NombreFamiliar;
            }


        }


        internal bool Validaciones()
        {

            if (String.IsNullOrWhiteSpace(familiarAlumno.DniFamiliar))
            {
                if (this.familiarAlumnoSinModificaciones != null)
                    this.CompletarNombresDNI();

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'DNI' es obligatorio");
                nueva.ShowDialog();
                return false;
            }
            else
            {

                if (familiarAlumno.DniFamiliar.Length < 8)
                {
                    if (this.familiarAlumnoSinModificaciones != null)
                        this.CompletarNombresDNI();

                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El DNI debe tener 8 dígitos");
                    nueva.ShowDialog();
                    return false;

                }
                else
                {
                    if (new FamiliarAlumnoLogica().ExisteDNI(familiarAlumno.DniFamiliar, familiarAlumno.LegajoFamiliar))
                    {

                        if (this.familiarAlumnoSinModificaciones != null)
                            this.CompletarNombresDNI();

                        VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El familiar que desea ingresar ya existe en el sistema");
                        nueva.ShowDialog();
                        return false;

                    }
                }
            }

            if (String.IsNullOrWhiteSpace(familiarAlumno.NombreFamiliar))
            {
                if (this.familiarAlumnoSinModificaciones != null)
                    this.CompletarNombresDNI();


                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Nombre' es obligatorio");
                nueva.ShowDialog();
                return false;
            }

            if (String.IsNullOrWhiteSpace(familiarAlumno.ApellidoFamiliar))
            {
                if (this.familiarAlumnoSinModificaciones != null)
                    this.CompletarNombresDNI();


                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Apellido' es obligatorio");
                nueva.ShowDialog();
                return false;
            }

            if (String.IsNullOrWhiteSpace(familiarAlumno.DireccionFamiliar))
            {
                if (this.familiarAlumnoSinModificaciones != null)
                    this.familiarAlumno.DireccionFamiliar = this.familiarAlumnoSinModificaciones.DireccionFamiliar;
                
                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Dirección' es obligatorio");
                nueva.ShowDialog();
                return false;
            }

            if (this.familiarAlumno.FechaNacimiento.ToShortDateString() == "01/01/0001")
            {
                if (this.familiarAlumnoSinModificaciones != null)
                    this.familiarAlumno.FechaNacimiento = this.familiarAlumnoSinModificaciones.FechaNacimiento;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Fecha de Nacimiento' es obligatorio");
                nueva.ShowDialog();
                return false;
            }


            if (this.familiarAlumno.FechaNacimiento >= DateTime.Now)
            {
                if (this.familiarAlumnoSinModificaciones != null)
                    this.familiarAlumno.FechaNacimiento = this.familiarAlumnoSinModificaciones.FechaNacimiento;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "La Fecha de Nacimiento ingresada es incorrecta");
                nueva.ShowDialog();
                return false;
            }

            if (String.IsNullOrWhiteSpace(familiarAlumno.LocalidadFamiliar))
            {
                if (this.familiarAlumnoSinModificaciones != null)
                    this.familiarAlumno.LocalidadFamiliar = this.familiarAlumnoSinModificaciones.LocalidadFamiliar;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Localidad' es obligatorio");
                nueva.ShowDialog();
                return false;
            }


            if (String.IsNullOrWhiteSpace(familiarAlumno.TelefonoFijo))
            {

                if (familiarAlumno.TelefonoMovil == null || familiarAlumno.TelefonoMovil == "")
                {
                    if (this.familiarAlumnoSinModificaciones != null)
                    {
                        this.familiarAlumno.TelefonoMovil = this.familiarAlumnoSinModificaciones.TelefonoMovil;
                        this.familiarAlumno.TelefonoFijo = this.familiarAlumnoSinModificaciones.TelefonoFijo;
                    }

                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Debe ingresar al menos un teléfono (Fijo o Celular)");
                    nueva.ShowDialog();
                    return false;
                }

            }
            else
            {
                if (familiarAlumno.TelefonoFijo.Length < 6)
                {
                    if (this.familiarAlumnoSinModificaciones != null)
                        this.familiarAlumno.TelefonoFijo = this.familiarAlumnoSinModificaciones.TelefonoFijo;

                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "La cantidad de dígitos del teléfono fijo es incorrecta");
                    nueva.ShowDialog();
                    return false;

                }


            }

            if (!String.IsNullOrWhiteSpace(familiarAlumno.TelefonoMovil))
            {
                if (familiarAlumno.TelefonoMovil.Length < 10)
                {
                    if (this.familiarAlumnoSinModificaciones != null)
                        this.familiarAlumno.TelefonoMovil = this.familiarAlumnoSinModificaciones.TelefonoMovil;

                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "        La cantidad de dígitos del teléfono celular es incorrecta \n                        (¿Escribió el código de área?)");
                    nueva.ShowDialog();
                    return false;

                }
            }

            if (!String.IsNullOrWhiteSpace(familiarAlumno.TelefonoTrabajo))
            {
                if (familiarAlumno.TelefonoTrabajo.Length < 6)
                {
                    if (this.familiarAlumnoSinModificaciones != null)
                        this.familiarAlumno.TelefonoTrabajo = this.familiarAlumnoSinModificaciones.TelefonoTrabajo;


                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "La cantidad de dígitos del teléfono laboral es incorrecta");
                    nueva.ShowDialog();
                    return false;

                }
            }


            return true;
        }



    }
}
